package com.blog.cmrpersonalblog.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.blog.cmrpersonalblog.dto.category.request.CategoryBatchOperationRequest;
import com.blog.cmrpersonalblog.dto.category.request.CategoryCreateRequest;
import com.blog.cmrpersonalblog.dto.category.request.CategoryQueryRequest;
import com.blog.cmrpersonalblog.dto.category.request.CategoryUpdateRequest;
import com.blog.cmrpersonalblog.dto.category.response.CategoryManagementResponse;
import com.blog.cmrpersonalblog.entity.ArticleCategory;

import java.util.List;
import java.util.Map;

/**
 * 分类管理服务接口
 */
public interface CategoryManagementService {

    /**
     * 分页查询分类列表
     * @param queryRequest 查询条件
     * @return 分页结果
     */
    IPage<CategoryManagementResponse> getCategoryList(CategoryQueryRequest queryRequest);

    /**
     * 获取分类详情
     * @param categoryId 分类ID
     * @return 分类详情
     */
    CategoryManagementResponse getCategoryDetail(Long categoryId);

    /**
     * 创建分类
     * @param createRequest 创建请求
     * @param operatorId 操作人ID
     * @return 创建结果
     */
    boolean createCategory(CategoryCreateRequest createRequest, Long operatorId);

    /**
     * 更新分类
     * @param updateRequest 更新请求
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    boolean updateCategory(CategoryUpdateRequest updateRequest, Long operatorId);

    /**
     * 删除分类
     * @param categoryId 分类ID
     * @param operatorId 操作人ID
     * @return 删除结果
     */
    boolean deleteCategory(Long categoryId, Long operatorId);

    /**
     * 批量操作分类
     * @param batchRequest 批量操作请求
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    Map<String, Object> batchOperateCategories(CategoryBatchOperationRequest batchRequest, Long operatorId);

    /**
     * 启用分类
     * @param categoryId 分类ID
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean enableCategory(Long categoryId, Long operatorId);

    /**
     * 禁用分类
     * @param categoryId 分类ID
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean disableCategory(Long categoryId, Long operatorId);

    /**
     * 更新分类排序
     * @param categoryId 分类ID
     * @param sortOrder 新的排序值
     * @param operatorId 操作人ID
     * @return 操作结果
     */
    boolean updateCategorySortOrder(Long categoryId, Integer sortOrder, Long operatorId);

    /**
     * 获取启用的分类列表（用于下拉选择）
     * @return 启用的分类列表
     */
    List<ArticleCategory> getEnabledCategories();

    /**
     * 检查分类名称是否已存在
     * @param name 分类名称
     * @param excludeId 排除的分类ID（用于更新时检查）
     * @return 是否存在
     */
    boolean existsCategoryName(String name, Long excludeId);

    /**
     * 检查分类是否被文章使用
     * @param categoryId 分类ID
     * @return 是否被使用
     */
    boolean isCategoryUsedByArticles(Long categoryId);

    /**
     * 获取分类统计信息
     * @return 统计信息
     */
    Map<String, Object> getCategoryStatistics();

    /**
     * 获取分类状态分布
     * @return 状态分布
     */
    List<Map<String, Object>> getCategoryStatusDistribution();

    /**
     * 获取分类使用情况统计
     * @return 使用情况统计
     */
    List<Map<String, Object>> getCategoryUsageStatistics();

    /**
     * 获取下一个排序值
     * @return 下一个排序值
     */
    Integer getNextSortOrder();

    /**
     * 获取分类的文章数量
     * @param categoryId 分类ID
     * @return 文章数量
     */
    Long getCategoryArticleCount(Long categoryId);

    /**
     * 获取分类的已发布文章数量
     * @param categoryId 分类ID
     * @return 已发布文章数量
     */
    Long getCategoryPublishedArticleCount(Long categoryId);
}
